/**
 * 项目名：student
 * 修改历史：
 * 作者： MZ
 * 创建时间： 2016年1月6日-上午10:00:07
 */
package studentsinfomanagement.dao;

import studentsinfomanagement.bean.Student;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * 模块说明： 学生增删改查

 */
public class StudentDAO extends BaseDAO {
	private final int fieldNum = 5;//学生信息条字段数
	private final int showNum = 15;//每个页面显示的学生信息条数
	private static StudentDAO sd = null;

	/**
	 * 采用单例模式
	 * @return 该类的实例
	 */
	public static synchronized StudentDAO getInstance() {
		if (sd == null) {
			sd = new StudentDAO();
		}
		return sd;
	}

	/**
	 * 学生登录系统
	 * @param sno 学工号
	 * @param password 密码
	 * @return
	 */
	public boolean queryForLogin(String sno, String password) {
		boolean result = false;
		if (sno.length() == 0 || password.length() == 0) {
			return result;
		}
		//编写sql语句，准备参数
		String sql = "select * from student where sno=? and password=?";
		String[] param = { sno, password };
		//调用数据库工具的查询方法
		rs = db.executeQuery(sql, param);
		//查询得到结果则验证通过
		try {
			if (rs.next()) {
				result = true;
			}
		} catch (SQLException e) {
			result = false;
		} finally {
			destroy();
		}
		return result;
	}

	/**
	 * 更新数据库中student对象信息
	 * @param stu
	 * @return
	 */
	public boolean update(Student stu) {
		boolean result = false;
		if (stu == null) {
			return result;
		}
		try {
			// 查询学生是否存在
			if (queryBySno(stu.getSno()) == 0) {
				return result;
			}
			// 执行更新操作
			String sql = "update student set sex=?,password=? where name=? and sno=?";
			String[] param = { stu.getSex(), stu.getPassword(), stu.getName(), stu.getSno() };
			int rowCount = db.executeUpdate(sql, param);
			if (rowCount == 1) {
				result = true;
			}
		} catch (SQLException e) {
			result = false;
		} finally {
			destroy();
		}
		return result;
	}

	/**
	 * 删除学生信息
	 * @param stu 学生对象
	 * @return 操作结果
	 */
	public boolean delete(Student stu) {
		boolean result = false;
		if (stu == null) {
			return result;
		}
		String sql = "delete from student where sno=?";
		String[] param = { stu.getSno() };
		int rowCount = db.executeUpdate(sql, param);
		if (rowCount == 1) {
			result = true;
		}
		destroy();
		return result;
	}

	/**
	 * 	添加学生信息
	 * @param stu 学生对象
	 * @return 操作结果
	 */
	public boolean add(Student stu) {
		boolean result = false;
		if (stu == null) {
			return result;
		}
		try {
			// 检查学生是否存在
			if (queryBySno(stu.getSno()) == 1) {
				return result;
			}
			// 执行插入语句
			String sql = "insert into student(name,sno,sex,dno,password) values(?,?,?,?,?)";
			String[] param = { stu.getName(), stu.getSno(), stu.getSex(), stu.getDepartment(), stu.getPassword() };
			if (db.executeUpdate(sql, param) == 1) {
				result = true;
			}
		} catch (SQLException e) {
			result = false;
		} finally {
			destroy();
		}
		return result;
	}

//	/**
//	 * 通过学生姓名查询学生信息
//	 * @param name 学生姓名
//	 * @return 查询结果
//	 */
//	public String[][] queryByName(String name) {
//		String[][] result = null;
//		if (name.length() < 0) {
//			return result;
//		}
//		//存储查询结果的集合
//		List<Student> stus = new ArrayList<Student>();
//		int i = 0;
//		//准备sql查询语句
//		String sql = "select * from student where name like ?";
//		String[] param = { "%" + name + "%" };
//		//调用数据库工具类的查询方法
//		rs = db.executeQuery(sql, param);
//		try {
//			while (rs.next()) {
//				buildList(rs, stus, i);
//				i++;
//			}
//			if (stus.size() > 0) {
//				result = new String[stus.size()][fieldNum];
//				for (int j = 0; j < stus.size(); j++) {
//					buildResult(result, stus, j);
//				}
//			}
//		} catch (SQLException se) {
//			se.printStackTrace();
//		} finally {
//			destroy();
//		}
//
//		return result;
//	}
//
//	/**
//	 * 查询某个页面的学生信息
//	 * @param pageNum 页面号
//	 * @return 查询结果
//	 */
//	public String[][] list(int pageNum) {
//		String[][] result = null;
//		if (pageNum < 1) {
//			return result;
//		}
//		//存储查询结果的集合
//		List<Student> stus = new ArrayList<Student>();
//		int i = 0;
//		int beginNum = (pageNum - 1) * showNum;
//		//准备查询语句
//		String sql = "select * from student limit ?,?";
//		Integer[] param = { beginNum, showNum };
//		//调用数据库工具类的查询方法
//		rs = db.executeQuery(sql, param);
//		try {
//			while (rs.next()) {
//				buildList(rs, stus, i);
//				i++;
//			}
//			if (stus.size() > 0) {
//				result = new String[stus.size()][fieldNum];
//				for (int j = 0; j < stus.size(); j++) {
//					buildResult(result, stus, j);
//				}
//			}
//		} catch (SQLException se) {
//			se.printStackTrace();
//		} finally {
//			destroy();
//		}
//
//		return result;
//	}
//
//	/**
//	 * 将rs记录添加到list中
//	 * @param rs 查询结果
//	 * @param list 集合
//	 * @param i 在集合中的下标
//	 * @throws SQLException
//	 */
//	private void buildList(ResultSet rs, List<Student> list, int i) throws SQLException {
//		Student stu = new Student();
//		stu.setId(i + 1);
//		stu.setName(rs.getString("name"));
//		stu.setDepartment(rs.getString("department"));
//		stu.setPassword(rs.getString("password"));
//		stu.setSex(rs.getString("sex"));
//		stu.setSno(rs.getString("sno"));
//		list.add(stu);
//	}
//
//	/**
//	 * 将list中记录添加到二维数组中
//	 * @param result 目标二位数组
//	 * @param stus 学生信息
//	 * @param j 存储的行下标
//	 */
//	private void buildResult(String[][] result, List<Student> stus, int j) {
//		Student stu = stus.get(j);
//		result[j][0] = String.valueOf(stu.getId());
//		result[j][1] = stu.getName();
//		result[j][2] = stu.getSno();
//		result[j][3] = stu.getSex();
//		result[j][4] = stu.getDepartment();
//		result[j][5] = stu.getPassword();
//	}

	/**
	 * 根据学号查询学生是否存在
	 * @param sno 学号
	 * @return 查询结果 1-学生存在 0-学生不存在
	 * @throws SQLException
	 */
	private int queryBySno(String sno) throws SQLException {
		int result = 0;
		if ("".equals(sno) || sno == null) {
			return result;
		}
		//准备sql查询语句
		String checkSql = "select * from student where sno=?";
		//准备参数
		String[] checkParam = { sno };
		//调用数据库工具类的查询方法，执行查询语句
		rs = db.executeQuery(checkSql, checkParam);
		//如果查询结果集合不为空表示查询到了学生信息
		if (rs.next()) {
			result = 1;
		}
		return result;
	}

	/**
	 * 根据学号获取学生信息
	 * @param sno 学号
	 * @return
	 */
	public Student getStudentBySno(String sno){
		//准备sql查询语句
		String checkSql = "select * from student where sno=?";
		//准备参数
		String[] checkParam = { sno };
		//调用数据库工具类的查询方法，执行查询语句
		rs = db.executeQuery(checkSql, checkParam);
		Student result = null;
 		try {
			if(rs.next()){
				result = new Student();
				result.setName(rs.getString("name"));
				result.setSno(rs.getString("sno"));
				result.setDepartment(rs.getString("dno"));
				result.setSex(rs.getString("sex"));
				result.setPassword(rs.getString("password"));
			}
		} catch (SQLException e) {
			result = null;
		}
		return result;
	}

	/**
	 * 获取全部学生信息
	 * @return 学生列表
	 */
	public List<Student> getAllStudents(){
		String sql = "select * from student";
		ResultSet rs = db.executeQuery(sql);
		List<Student> studentList = new ArrayList<>();
		try {
			while (rs.next()){
				Student student = new Student();
				student.setSno(rs.getString("sno"));
				student.setName(rs.getString("name"));
				student.setSex(rs.getString("sex"));
				student.setDepartment(rs.getString("dno"));
				studentList.add(student);
			}
		} catch (SQLException throwables) {

		}
		return studentList;
	}

}
